package org.jmh.gift.service.impl;

import org.jmh.gift.domain.dto.PhoneCodeDTO;
import org.jmh.gift.enums.SystemErrorCode;
import org.jmh.gift.exception.BusinessException;
import org.jmh.gift.service.ICommonService;
import org.jmh.gift.util.JMHAssert;
import org.jmh.gift.util.StrUtils;
import org.jmh.gift.util.VerifyCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Service
public class ICommonServiceImpl implements ICommonService {
    @Autowired
    private RedisTemplate redisTemplate;

    //图形验证
    @Override
    public String createImgCode(String uuid) {
        //1.生成图形验证码里面的数字
        String code = StrUtils.getRandomString(4);
        //2.把数字和uuid放到redis里面，到时过期
        redisTemplate.opsForValue().set(uuid,code,5, TimeUnit.MINUTES);
        //3.把数字转换成一个图片,返回一张图片
        try {
            return VerifyCodeUtils.verifyCode(102, 42, code);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    //图形验证

//        1.验证图形验证码
//        2.生成手机验证码
//        3.把验证码发送到用户的手机上
//        4.1分钟内不能发送两次，存储到redis的时候 存储发送的时间
//        5.网络延迟问题:多次发送验证码 用户怎么使用
//           方案1:两次发送验证码是同一个 -->等会就使用这种方案
//           方案2:发送两个不同的验证码,输入其中的任意一个都OK -->redis里面使用list存储
//        6.一个系统发送验证码的位置有多个,不同功能的验证码能不能再一分钟内发送两个
//            redis存储数据的时候添加上一个用于去区分功能的前缀
//            key  前缀:手机号


    @Override
    public void createPhoneCode(PhoneCodeDTO dto) {

        //自定义一个key
        String key = dto.getType()+":"+dto.getPhone();

        //1.验证图形验证码
        Object o = redisTemplate.opsForValue().get(dto.getUuid());
        if(dto.getType().equals("REG")) {
            JMHAssert.isNotNull(o, SystemErrorCode.RESPONSE_CODE_500002);
            //2.比较一致性
            JMHAssert.isEq(dto.getImgCode(), o.toString(), SystemErrorCode.RESPONSE_CODE_500002);
        }
        //3.生成手机验证码(先发验证码再进行逻辑判断)
        String code = StrUtils.getRandomString(6);
        Object o1 = redisTemplate.opsForValue().get(key);
        if(o1!=null){
            Long aLong = Long.valueOf(o1.toString().split(":")[1]);
            if((System.currentTimeMillis()-aLong)<60*1000){
                throw new BusinessException(SystemErrorCode.RESPONSE_CODE_500001);
            }
            //不进if报错就重置
            code=o1.toString().split(":")[0];
        }


        //4.将验证码发送到手机上
//        SmsUtils.sendMsg(dto.getPhone(),code);
        System.out.println("本次的验证码为:"+code);

        //5.将数据存储到redis
        redisTemplate.opsForValue().set(key,code+":"+System.currentTimeMillis(),5,TimeUnit.MINUTES);

    }

    //手机短信验证


}
